<?php
// +----------------------------------------------------------------------
// | OneThink [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013 http://www.onethink.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: 麦当苗儿 <zuojiazi@vip.qq.com> <http://www.zjzit.cn>
// +----------------------------------------------------------------------

namespace Home\Controller;

/**
 * 解决黑屏房间方案：
 * 如果主播的手机意外断网，或者 App 意外崩溃了，Client 会丧失通知服务器的机会，从而在房间列表中残留一些黑屏房间（主播已经没法推流了，
   但是没有人关闭这些房间，所以观众进入房间后看到的是黑屏）。
 *
 * 您的 Server 可以通过腾讯云 REST API（Live_Channel_GetStatus）定时（推荐 10s 一次）地检查所有 “正在直播（active） ”
 * 状态中的房间是不是真的都是“正在推流”状态。如果某个房间在连续三次的查询结果中均为“离线”状态，Server 就可以判定其为 “黑屏房间” 并将其关闭了。
 */
class ChannelController extends HomeController{
    public function do_channel(){
        $list = M('anchor')->field('auid,number')->where(['is_show' => 2])->select();
        foreach($list as $k => $v){
            $info = singer_channel(C('ZB_BIZID').'_'.$v['number']);
            $info = json_decode($info,true);
            $status = $info['output']['0']['status'];//0：断流；1：开启；3：关闭   注意，当从腾讯云控制台关注某条直播流的时候返回status为3

            $count = M('accident')->where(['auid' => $v['auid']])->count();

            if($status == 0){
                //断流
                if($count > 0){
                    M('accident')->where(['auid' => $v['auid']])->setInc('count');
                    $inc_count = M('accident')->where(['auid' => $v['auid']])->getField('count');
                    if($inc_count > 2){
                        //至少第三次检测到断流
                        M('accident')->where(['auid' => $v['auid']])->delete();
                        M('anchor')->where(['auid' => $v['auid']])->setField('is_show',0);
                        file_put_contents(RUNTIME_PATH.'channel.txt',date('Y-m-d H:i:s').': 执行sql:'.M()->getLastSql().PHP_EOL,FILE_APPEND);
                    }
                }else{
                    //第一次检测到断流,添加数据
                    $data = [
                        'auid' => $v['auid'],
                        'count' => 1
                    ];

                    M('accident')->add($data);
                }
            }else{
                //此次检测到推流正常
                if($count > 1){
                    //在连续检测断流时，第三次之前检测到推流正常，将之前的断流记录删除
                    M('accident')->where(['auid' => $v['auid']])->delete();
                }
            }
        }
    }
}
